package com.jfree.nettyshow.client.handler;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

/**
 * @author wangjian
 * @date 2019/10/23 17:03
 */
public class ChildChannelHandler extends ChannelInitializer<SocketChannel> {

    // TODO https://segmentfault.com/a/1190000006931568 IdleStateHandler 心跳机制 和userEventTriggered有关联

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        System.out.println("初始化----initChannel");
        //TODO 实际开发是否需要重写LengthFieldBasedFrameDecoder？
        //TODO 研究LengthFieldBasedFrameDecoder源码

        //TODO 如果发送了错误协议的数据，则在发送数据，server不接受数据了，但客户端还提示发送成功，研究一下.

        // TODO 看源码发现问题是readerindex和writerindex都是15没有可读的了，然后要读的长度发现很大，
        // TODO 再研究一下，然后做一个实验加入传入过大的数据会有什么后果会不会也导致和传错误数据一样的后果？？
        ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(
                20, 0, 4, 0, 0));
        //ch.pipeline().addLast(new LengthFieldPrepender(4));
        // ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
        // ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
        //TODO 到了这里TimeServerHandler,如果msg是ByteBuf，最好再判断字节是否正确防止处理错误数据
        ch.pipeline().addLast(new TimeServerHandler());
        ch.pipeline().addLast(new ChannelInboundHandlerAdapter2());
    }

}
